package co.edu.usbcali.sgi.presentation.backEndBeans;



import co.edu.usbcali.sgi.exceptions.*;
import co.edu.usbcali.sgi.modelo.*;
import co.edu.usbcali.sgi.modelo.dto.PaisDTO;
import co.edu.usbcali.sgi.presentation.businessDelegate.BusinessDelegatorView;
import co.edu.usbcali.sgi.utilities.*;

import com.icesoft.faces.async.render.RenderManager;
import com.icesoft.faces.async.render.Renderable;
import com.icesoft.faces.component.ext.HtmlCommandButton;
import com.icesoft.faces.component.ext.HtmlDataTable;
import com.icesoft.faces.component.ext.HtmlInputText;
import com.icesoft.faces.component.ext.HtmlSelectOneMenu;
import com.icesoft.faces.component.selectinputdate.SelectInputDate;
import com.icesoft.faces.context.DisposableBean;
import com.icesoft.faces.webapp.xmlhttp.FatalRenderingException;
import com.icesoft.faces.webapp.xmlhttp.PersistentFacesState;
import com.icesoft.faces.webapp.xmlhttp.RenderingException;
import com.icesoft.faces.webapp.xmlhttp.TransientRenderingException;

import java.math.BigDecimal;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.TimeZone;
import java.util.Vector;

import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;


public class PaisView extends DataSource implements Renderable, DisposableBean {
	public HtmlCommandButton getBtnConsultar() {
		return btnConsultar;
	}

	public void setBtnConsultar(HtmlCommandButton btnConsultar) {
		this.btnConsultar = btnConsultar;
	}

//	public List<SelectItem> getListPais() {
//		return listPais;
//	}
//
//	public void setListPais(List<SelectItem> listPais) {
//		this.listPais = listPais;
//	}

	private HtmlInputText txtPaiNombre;
	private HtmlSelectOneMenu cmbEstCodigo_Estado;
//	private HtmlInputText txtPaiCod;
	private HtmlCommandButton btnSave;
	private HtmlCommandButton btnModify;
	private HtmlCommandButton btnDelete;
	private HtmlCommandButton btnClear;
	private HtmlCommandButton btnConsultar;
	private HtmlDataTable tablaPais = new HtmlDataTable();
	private boolean renderDataTable;
	private boolean flag = true;
	private RenderManager renderManager;
	private PersistentFacesState state = PersistentFacesState.getInstance();
	private List<Pais> pais  = new ArrayList<Pais>();
	private List<PaisDTO> paisDTO;
	private List<SelectItem> listEstado = new ArrayList<SelectItem>();


	public HtmlDataTable getTablaPais() {
		return tablaPais;
	}

	public void setTablaPais(HtmlDataTable tablaPais) {
		this.tablaPais = tablaPais;
	}

	public PaisView() {
		super("");
	}

	public String action_inactivar() {
		try {

			//String paiCodigo = txtPaiCod.getValue().toString();
			String estado = cmbEstCodigo_Estado.getValue().toString();
			//String est="INACTIVO";
			String paiNombre = txtPaiNombre.getValue().toString();

//			if (!Utilities.soloNumerosyLetras(paiCodigo)) {
//				throw new Exception(
//				"El codigo del  pais no debe contener caracteres especiales");
//			}
//			if (paiCodigo.trim().equals("")) {
//				throw new Exception("Este campo es obligatorio ");
//			}

//			if (estado.trim().equals("")) {
//				throw new Exception("Debe elejir alguna opcion");
//			}

			if (!Utilities.soloLetras(paiNombre)) {
				throw new Exception("El nombre debe contener solo letras");
			}

			if (paiNombre.trim().equals("")) {
				throw new Exception("El nombre del pais debe ser obligatorio");
			}


			BusinessDelegatorView
			.updatePais( paiNombre, "INACTIVO");
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYDELETED);
			action_clear();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}
//	 public String action_CargarP() throws Exception {
//	    	String nomPais = txtPaiNombre.getValue().toString();
//	    	try {
//				Pais pais = BusinessDelegatorView.getPais(nomPais);
//				txtPaiNombre.setValue(pais.getPaiNombre());
//				String estado =pais.getEstado().getEstNombre().toString();
//				
//				
//			} catch (NumberFormatException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
//	        return "";
//	    }
	    public void action_consultarPais(){
	    	String nombre =txtPaiNombre.getValue().toString().toUpperCase();
	    	try {
	    	
	    		BusinessDelegatorView.consultarPaisNombre(nombre);
							
				
				System.out.println("Vista: " + pais);
			} catch (Exception e) {
				// TODO: handle exception
			}
			
	    }
//	public void action_consultarPais(ActionEvent evento) {
//		try {
//
//			String nombrePais = txtPaiNombre.getValue().toString().toUpperCase();
//			if (nombrePais == null || nombrePais == "") {
//				pais = BusinessDelegatorView.findByCriteriaInPais(null, null, null, true);
//						
//			} else {
//				Object variables[] = {"paiNombre",true,nombrePais + '%',"Like"};
//				pais = BusinessDelegatorView.findByCriteriaInPais(variables, null, null, true);
//				
//				//System.out.println("Aqui");
//			}
//			flag = true;
//			renderManager.getOnDemandRenderer("paisView")
//			.requestRender();
//
//		} catch (Exception e) {
//			// TODO: handle exception
//		}
//
//		
//	}
//   
	
	public HtmlSelectOneMenu getCmbEstCodigo_Estado() {
		try {
			List<Estado> list = BusinessDelegatorView.findByCriteriaInEstado(
					null, null, null);
			listEstado.clear();
			listEstado.add(new SelectItem(0, " Seleccione el Estado.. "));

			for (Estado estado : list) {
				listEstado.add(new SelectItem(estado.getEstCod(), estado
						.getEstNombre()));
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return cmbEstCodigo_Estado;
	}

	public void setCmbEstCodigo_Estado(HtmlSelectOneMenu cmbEstCodigoEstado) {
		cmbEstCodigo_Estado = cmbEstCodigoEstado;
	}

	public List<SelectItem> getListEstado() {
		return listEstado;
	}

	public void setListEstado(List<SelectItem> listEstado) {
		this.listEstado = listEstado;
	}

	public String action_clear() {
		txtPaiNombre.setValue(null);
		txtPaiNombre.setDisabled(true);
		cmbEstCodigo_Estado.setValue(null);
		cmbEstCodigo_Estado.setDisabled(true);
//		txtPaiCod.setValue(null);
//		txtPaiCod.setDisabled(false);
		btnSave.setDisabled(true);
		btnDelete.setDisabled(true);
		btnModify.setDisabled(true);
		btnClear.setDisabled(false);

		return "";
	}
	 public String action_Cargar() throws Exception {
	    	String pais = txtPaiNombre.getValue().toString();
	    	try {
				Pais pai = BusinessDelegatorView.getPais(pais);
				txtPaiNombre.setValue(pai.getPaiNombre());
								
			} catch (NumberFormatException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	        return "";
	    }
	    
//	public void listener_txtId(ValueChangeEvent event) {
//		if ((event.getNewValue() != null) && !event.getNewValue().equals("")) {
//			Pais entity = null;
//
//			try {
//				String paiCod = new String(txtPaiNombre.getValue().toString());
//				entity =  BusinessDelegatorView.consultarPaisNombre(paiCod);
//				System.out.println("vista: "+pais.get(0).getPaiNombre());
//			} catch (Exception e) {
//				// TODO: handle exception
//			}
//
//			if (entity == null) {
//				txtPaiNombre.setDisabled(false);
////				cmbEstCodigo_Estado.setDisabled(false);
////				txtPaiCod.setDisabled(false);
//				btnSave.setDisabled(false);
//				btnDelete.setDisabled(false);
//				btnModify.setDisabled(false);
//				btnClear.setDisabled(false);
//			} else {
//				
//				
////			txtPaiNombre.setValue(pais.add(e));
//				txtPaiNombre.setDisabled(false);
////				cmbEstCodigo_Estado.setValue().getEstado().getEstCod());
////				cmbEstCodigo_Estado.setDisabled(false);
////				txtPaiCod.setValue(entity.getPaiCod());
////				txtPaiCod.setDisabled(true);
////				btnSave.setDisabled(true);
////				btnDelete.setDisabled(false);
////				btnModify.setDisabled(false);
////				btnClear.setDisabled(false);
//			}
//		}
//	}

	public String action_save() {
		try {
//			String codigo = txtPaiCod.getValue().toString();
			String nombre = txtPaiNombre.getValue().toString().toUpperCase();
//			String estado = cmbEstCodigo_Estado.getValue().toString();
				//"ACTIVO";

			if (!Utilities.soloLetras(nombre)) {
				throw new Exception("El nombre debe contener solo letras");
			}

			if (nombre.trim().equals("")) {
				throw new Exception("El nombre del pais debe ser obligatorio");
			}
//			if (estado.trim().equals("")) {
//				throw new Exception("Debe elejir alguna opcion");
//			}
			BusinessDelegatorView.savePais(nombre, "ACTIVO");
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYSAVED);
			action_clear();

		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_delete() {
		try {
			BusinessDelegatorView.deletePais(FacesUtils.checkString(txtPaiNombre));
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYDELETED);
			action_clear();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_modify() {
		try {
//			String codigo = txtPaiCod.getValue().toString();
			String nombre = txtPaiNombre.getValue().toString().toUpperCase();
			String est = "ACTIVO";
			String estado =cmbEstCodigo_Estado.getValue().toString();
			if (!Utilities.soloLetras(nombre)) {
				throw new Exception("El nombre debe contener solo letras");
			}

			if (nombre.trim().equals("")) {
				throw new Exception("El nombre del pais debe ser obligatorio");
			}
		
			BusinessDelegatorView.updatePais( nombre, est);
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
			action_clear();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_modifyWitDTO( String paiNombre,
			String estCod_Estado) throws Exception {
		try {
			BusinessDelegatorView.updatePais( paiNombre, estCod_Estado);
			renderManager.getOnDemandRenderer("PaisView").requestRender();
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
		} catch (Exception e) {
			//renderManager.getOnDemandRenderer("PaisView").requestRender();
			FacesUtils.addErrorMessage(e.getMessage());
			throw e;
		}

		return "";
	}

	public List<Pais> getPais() {
		if (flag) {
			try {
				pais = BusinessDelegatorView.getPais();
				flag = false;
			} catch (Exception e) {
				flag = true;
				FacesUtils.addErrorMessage(e.getMessage());
			}
		}

		return pais;
	}

	public boolean isFlag() {
		return flag;
	}

	public void setPais(List<Pais> pais) {
		this.pais = pais;
	}

	public boolean isRenderDataTable() {
		try {
			if (flag) {
				if (BusinessDelegatorView.findTotalNumberPais() > 0) {
					renderDataTable = true;
				} else {
					renderDataTable = false;
				}
			}

			flag = false;
		} catch (Exception e) {
			renderDataTable = false;
			e.printStackTrace();
		}

		return renderDataTable;
	}

	public DataModel getData() {
		state = PersistentFacesState.getInstance();

		if (onePageDataModel == null) {
			onePageDataModel = new LocalDataModel(pageSize);
		}

		return onePageDataModel;
	}

	/**
	 * This is where the Object data is retrieved from the database and
	 * returned as a list of objects for display in the UI.
	 */
	private DataPage<Pais> getDataPage(int startRow, int pageSize) {
		// Retrieve the total number of objects from the database.  This
		// number is required by the DataPage object so the paginator will know
		// the relative location of the page data.
		int totalNumberPais = 0;

		try {
			totalNumberPais = BusinessDelegatorView.findTotalNumberPais()
			.intValue();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		// Calculate indices to be displayed in the ui.
		int endIndex = startRow + pageSize;

		if (endIndex > totalNumberPais) {
			endIndex = totalNumberPais;
		}

		try {
			pais = BusinessDelegatorView.findPagePais(sortColumnName,
					sortAscending, startRow, endIndex - startRow);

			// Remove this Renderable from the existing render groups.
			//leaveRenderGroups();        			
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		// Add this Renderable to the new render groups.
		//joinRenderGroups();
		// Reset the dirtyData flag.
		onePageDataModel.setDirtyData(false);
		// This is required when using Hibernate.  If the SessionManager is not
		// cleared or closed objects are cached and stale objects will show up
		// in the table.
		// This way, the detached objects are reread from the database.
		// This call is not required with Hibernate, which uses a Query Hint
		// to clear the l2 cache in the DAO.
		flag = true;

		return new DataPage<Pais>(totalNumberPais, startRow, pais);
	}

	public DataModel getDataDTO() {
		state = PersistentFacesState.getInstance();

		if (onePageDataModel == null) {
			onePageDataModel = new LocalDataModelDTO(pageSize);
		}

		return onePageDataModel;
	}

	/**
	 * This is where the Object data is retrieved from the database and
	 * returned as a list of objects for display in the UI.
	 */
	private DataPage<PaisDTO> getDataPageDTO(int startRow, int pageSize) {
		// Retrieve the total number of objects from the database.  This
		// number is required by the DataPage object so the paginator will know
		// the relative location of the page data.
		int totalNumberPais = 0;

		try {
			totalNumberPais = BusinessDelegatorView.findTotalNumberPais()
			.intValue();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		// Calculate indices to be displayed in the ui.
		int endIndex = startRow + pageSize;

		if (endIndex > totalNumberPais) {
			endIndex = totalNumberPais;
		}

		try {
			pais = BusinessDelegatorView.findPagePais(sortColumnName,
					sortAscending, startRow, endIndex - startRow);

			if (Utilities.validationsList(pais)) {
				paisDTO = new ArrayList<PaisDTO>();

				for (Pais paisTmp : pais) {
					PaisDTO paisDTO2 = new PaisDTO();
//					paisDTO2.setPaiCod(paisTmp.getPaiCod().toString());
					paisDTO2.setPaiNombre((paisTmp.getPaiNombre() != null)
							? paisTmp.getPaiNombre().toString() : null);
					paisDTO2.setEstCod_Estado((paisTmp.getEstado().getEstCod() != null)
							? paisTmp.getEstado().getEstCod().toString() : null);
					paisDTO2.setPais(paisTmp);
					paisDTO2.setPaisView(this);
					paisDTO.add(paisDTO2);
				}
			}

			// Remove this Renderable from the existing render groups.
			leaveRenderGroups();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		// Add this Renderable to the new render groups.
		joinRenderGroups();
		// Reset the dirtyData flag.
		onePageDataModel.setDirtyData(false);
		// This is required when using Hibernate.  If the SessionManager is not
		// cleared or closed objects are cached and stale objects will show up
		// in the table.
		// This way, the detached objects are reread from the database.
		// This call is not required with Hibernate, which uses a Query Hint
		// to clear the l2 cache in the DAO.
		flag = true;

		return new DataPage<PaisDTO>(totalNumberPais, startRow, paisDTO);
	}

	protected boolean isDefaultAscending(String sortColumn) {
		return true;
	}

	/**
	 * This method is called when a render call is made from the server. Render
	 * calls are only made to views containing an updated record. The data is
	 * marked as dirty to trigger a fetch of the updated record from the
	 * database before rendering takes place.
	 */
	public PersistentFacesState getState() {
		onePageDataModel.setDirtyData();

		return state;
	}

	/**
	 * This method is called from faces-config.xml with each new session.
	 */
	public void setRenderManager(RenderManager renderManager) {
		this.renderManager = renderManager;
	}

	public void renderingException(RenderingException arg0) {
		if (arg0 instanceof TransientRenderingException) {
		} else if (arg0 instanceof FatalRenderingException) {
			// Remove from existing Customer render groups.
			leaveRenderGroups();
		}
	}

	/**
	 * Remove this Renderable from existing uiCustomerBeans render groups.
	 * OnDemandRenderers are named/created using the underlying Customer Number.
	 */
	private void leaveRenderGroups() {
		if (Utilities.validationsList(paisDTO)) {
			for (PaisDTO paisTmp : paisDTO) {
				renderManager.getOnDemandRenderer("PaisView").remove(this);
			}
		}
	}

	/**
	 * Add this Renderable to the new uiCustomerBeans render groups.
	 * OnDemandRenderers are named/created using the underlying Customer Number.
	 */
	private void joinRenderGroups() {
		if (Utilities.validationsList(paisDTO)) {
			for (PaisDTO paisTmp : paisDTO) {
				renderManager.getOnDemandRenderer("PaisView").add(this);
			}
		}
	}

	public void dispose() throws Exception {
	}

	public RenderManager getRenderManager() {
		return renderManager;
	}

	public void setState(PersistentFacesState state) {
		this.state = state;
	}

	public HtmlInputText getTxtPaiNombre() {
		return txtPaiNombre;
	}

	public void setTxtPaiNombre(HtmlInputText txtPaiNombre) {
		this.txtPaiNombre = txtPaiNombre;
	}

//	public HtmlInputText getTxtPaiCod() {
//		return txtPaiCod;
//	}
//
//	public void setTxtPaiCod(HtmlInputText txtPaiCod) {
//		this.txtPaiCod = txtPaiCod;
//	}

	public HtmlCommandButton getBtnSave() {
		return btnSave;
	}

	public void setBtnSave(HtmlCommandButton btnSave) {
		this.btnSave = btnSave;
	}

	public HtmlCommandButton getBtnModify() {
		return btnModify;
	}

	public void setBtnModify(HtmlCommandButton btnModify) {
		this.btnModify = btnModify;
	}

	public HtmlCommandButton getBtnDelete() {
		return btnDelete;
	}

	public void setBtnDelete(HtmlCommandButton btnDelete) {
		this.btnDelete = btnDelete;
	}

	public HtmlCommandButton getBtnClear() {
		return btnClear;
	}

	public void setBtnClear(HtmlCommandButton btnClear) {
		this.btnClear = btnClear;
	}

	public void setRenderDataTable(boolean renderDataTable) {
		this.renderDataTable = renderDataTable;
	}

	public void setFlag(boolean flag) {
		this.flag = flag;
	}

	public List<PaisDTO> getPaisDTO() {
		return paisDTO;
	}

	public void setPaisDTO(List<PaisDTO> paisDTO) {
		this.paisDTO = paisDTO;
	}

	public TimeZone getTimeZone() {
		return java.util.TimeZone.getDefault();
	}

	/**
	 * A special type of JSF DataModel to allow a datatable and datapaginator
	 * to page through a large set of data without having to hold the entire
	 * set of data in memory at once.
	 * Any time a managed bean wants to avoid holding an entire dataset,
	 * the managed bean declares this inner class which extends PagedListDataModel
	 * and implements the fetchData method. fetchData is called
	 * as needed when the table requires data that isn't available in the
	 * current data page held by this object.
	 * This requires the managed bean (and in general the business
	 * method that the managed bean uses) to provide the data wrapped in
	 * a DataPage object that provides info on the full size of the dataset.
	 */
	private class LocalDataModel extends PagedListDataModel {
		public LocalDataModel(int pageSize) {
			super(pageSize);
		}

		public DataPage<Pais> fetchPage(int startRow, int pageSize) {
			// call enclosing managed bean method to fetch the data
			return getDataPage(startRow, pageSize);
		}
	}

	private class LocalDataModelDTO extends PagedListDataModel {
		public LocalDataModelDTO(int pageSize) {
			super(pageSize);
		}

		public DataPage<PaisDTO> fetchPage(int startRow, int pageSize) {
			// call enclosing managed bean method to fetch the data
			return getDataPageDTO(startRow, pageSize);
		}
	}
}
